package main

import (
	"bufio"
	"crypto/md5"
	"encoding/hex"
	"fmt"
	"os"
	"strings"
	"finalshell/sha3"
)

// MD5哈希生成（保持原逻辑）
func md5Hash(msg string) string {
	hasher := md5.New()
	hasher.Write([]byte(msg))
	return hex.EncodeToString(hasher.Sum(nil))
}

// Keccak-384哈希实现（与Python兼容）
func keccak384Hash(msg string) string {
	hash := sha3.NewLegacyKeccak384()
	hash.Write([]byte(msg))
	return hex.EncodeToString(hash.Sum(nil))
}

func main() {
	fmt.Println("\n" + strings.Repeat("*", 50))
    fmt.Println("*          FinalShell离线激活工具                *")
	fmt.Println("*                                                *")
    fmt.Println("*     本程序生成的激活码仅供学习研究使用         *")
    fmt.Println("*     严禁用于商业用途或非法目的                 *")
    fmt.Println("*     使用产生的任何风险由使用者自行承担         *")
    fmt.Println("*     作者不承担任何法律责任！                   *")
    fmt.Println(strings.Repeat("*", 50))
	reader := bufio.NewReader(os.Stdin)

	for {
		fmt.Print("输入机器码 (或输入 'exit' 退出): ")
		code, _ := reader.ReadString('\n')
		code = strings.TrimSpace(code)

		// 检查退出条件
		if code == "exit" {
			fmt.Println("程序已退出")
			break
		}

		// 新增验证逻辑
		parts := strings.Split(code, "@")
		if len(parts) != 2 || parts[0] != "q群740641908提供免费激活码" {
			fmt.Println("\n错误：机器码格式不正确！必须格式为：q群740641908提供免费激活码@机器码")
			fmt.Println("\n" + strings.Repeat("=", 50) + "\n")
			continue
		}

		// 激活码生成逻辑
		fmt.Println("\n激活码1(版本<3.9.6)")
		fmt.Println("高级版:", md5Hash("61305"+code+"8552")[8:24])
		fmt.Println("专业版:", md5Hash("2356"+code+"13593")[8:24])

		fmt.Println("\n激活码2(版本>=3.9.6)")
		fmt.Println("高级版:", keccak384Hash(code+"hSf(78cvVlS5E")[12:28])
		fmt.Println("专业版:", keccak384Hash(code+"FF3Go(*Xvbb5s2")[12:28])

		fmt.Println("\n激活码3(版本>=4.5)")
		fmt.Println("高级版:", keccak384Hash(code+"S3&*sbLbr")[12:28])
		fmt.Println("专业版:", keccak384Hash(code+"23Sfr3k&sc")[12:28])

		fmt.Println("\n激活码4(版本>=4.5.11)")
		fmt.Println("高级版:", keccak384Hash(code+"wcegS3gzA$")[12:28])
		fmt.Println("专业版:", keccak384Hash(code+"b(xxkHn%z);x")[12:28])

		fmt.Println("\n" + strings.Repeat("=", 50) + "\n") // 添加分隔线
	}
}